//============================================================================
// Name        : Hashing.cpp
// Author      : Daniel Mankowski
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================


#include "GenClaves.h"
#include "GuardarDisco.h"

using namespace std;

int main() {
	int 			cantClav;
	int 			lInf;
	int 			lSup;
	int 			opcion;
	int 			entero;
	bool 			flag;
	string 			archClaves;
	vector<double>  v_intervalos;
	vector<double>  v_densidad;

	cout << "Ingrese la cantidad de claves a generar: ";
	cin  >> cantClav;
	cout << endl;
	cout << "Ingrese el limite inferior: ";
	cin  >> lInf;
	cout << endl;
	cout << "Ingrese el limite superior: ";
	cin  >> lSup;
	cout << endl;
	GenClaves clave(lInf,lSup,cantClav);
	flag = false;
	while ( flag == false ){
		cout << "Elija la una de las siguiente opciones para la generacion de claves: " << endl;
		cout << "1 - Distribucion uniforme." << endl;
		cout << "2 - Distribucion sesgada por subintervalos." << endl;
		cin  >> opcion;

		if (opcion == 1){
			flag = true;
			clave.GenerarUniforme();
		}else if (opcion == 2){
			flag = true;
			cout << "Ingrese la cantidad de intervalos que se utilizaran: ";
			cin  >> opcion;
			//asignar el comienzo del intervalo al vector de intervalos
			v_intervalos.push_back(lInf);
			if (opcion == 1){
				clave.GenerarUniforme();
			}else{
				int flag_aux = false;
				int disponible = 100;
				v_densidad.push_back(0);//Densidad inicial es 0
				for (int cInt = 1; cInt <= opcion; cInt++){
					if (cInt==opcion){
						cout << "Se asigno el ultimo intervalo [" << v_intervalos[cInt-1] << "," << lSup <<"] con densidad " << disponible << "%" << endl;
						v_intervalos.push_back(lSup);
						v_densidad.push_back(100);
					}else{
						flag_aux = false;
						while (flag_aux == false){
							cout << "Ingrese intervalo desde [" << v_intervalos[cInt-1] << ",.. ) < " << lSup <<" :" <<endl;
							cin  >> entero;
							if (entero >= lSup){
								cout<< "Fuera de intervalo. Ingrese nuevamente!" << endl;
							}else
								flag_aux = true;
						}
						v_intervalos.push_back(entero);
						entero = 999;
						while (! (entero < disponible)){
							cout << "Ingrese la densidad de ese intervalo (" << disponible << "% disponible): ";
							cin  >> entero;
							if (! (entero < disponible) ){
							 cout << "Ingrese la densidad correctamente, supero el maximo disponible"<<endl;
							}
						}
						v_densidad.push_back(100 - disponible + entero);
						disponible -= entero;
					}
				}
				clave.GenerarIntervalos(v_intervalos,v_densidad);
			}

		}else{
			cout << "Opcion incorrecta" << endl;
			system("clear");
		}
	}
	if (opcion == 1 || opcion == 2){
		cout << "Ingrese el nombre del archivo de texto donde quiere guardar las claves (nonArch.txt)" << endl;
		cin  >> archClaves;
		GuardarDisco::GuardarClaves(clave.GetClaves(),archClaves.c_str());
	}
	return 0;
}
